#ifndef FLIP_CUSTOM_TILING_H
#define FLIP_CUSTOM_TILING_H

#include "register/tilingdata_base.h"

namespace optiling {
constexpr int32_t FLIP_CORE_NUM = 8; // default core count

// 数据类型标志位定义
enum DataTypeFlag {
    DT_UINT8  = 0,   // uint8类型
    DT_INT16  = 1,   // int16类型
    DT_INT32  = 2,   // int32类型
    DT_FLOAT16 = 3,  // half类型
    DT_FLOAT  = 4    // float类型
};

// Flip计算模式定义
enum FlipMode {
    MODE_N = 0,     // 沿维度N翻转
    MODE_C = 1,     // 沿维度C翻转
    MODE_H = 2,     // 沿维度H翻转
    MODE_W = 3      // 沿维度W翻转
};

BEGIN_TILING_DATA_DEF(FlipCustomTilingData)
    // 基础张量形状（折叠高维到 N, 并假定末两维是 H,W）
    TILING_DATA_FIELD_DEF(int32_t, N);
    TILING_DATA_FIELD_DEF(int32_t, C);
    TILING_DATA_FIELD_DEF(int32_t, H);
    TILING_DATA_FIELD_DEF(int32_t, W);
    TILING_DATA_FIELD_DEF(int32_t, computeSize);
    TILING_DATA_FIELD_DEF(int64_t, dim); // 0:N 1:C 2:H 3:W

    // 核间划分
    TILING_DATA_FIELD_DEF(int32_t, total_vectors);
    TILING_DATA_FIELD_DEF(int32_t, per_batch_vectors);
    TILING_DATA_FIELD_DEF(int32_t, per_channel_vectors);
    TILING_DATA_FIELD_DEF(int32_t, base_vectors_per_core);
    TILING_DATA_FIELD_DEF(int32_t, big_core_num);
    TILING_DATA_FIELD_DEF_ARR(int32_t, FLIP_CORE_NUM, core_vector_start);
    TILING_DATA_FIELD_DEF_ARR(int32_t, FLIP_CORE_NUM, core_vector_end);
    TILING_DATA_FIELD_DEF_ARR(int32_t, FLIP_CORE_NUM, core_vector_count);

    // 核内划分（tile）
    TILING_DATA_FIELD_DEF(int32_t, tile_vector_num);
    TILING_DATA_FIELD_DEF(int32_t, tile_compute_size);
    TILING_DATA_FIELD_DEF(int32_t, loop_times_compute);
    TILING_DATA_FIELD_DEF(int32_t, tail_compute);
    TILING_DATA_FIELD_DEF_ARR(int32_t, FLIP_CORE_NUM, core_loop_times_vector);
    TILING_DATA_FIELD_DEF_ARR(int32_t, FLIP_CORE_NUM, core_tail_vector);

    // 对齐与内存
    TILING_DATA_FIELD_DEF(int32_t, aligned_compute_size); // 对齐后的元素数
    TILING_DATA_FIELD_DEF(int32_t, bufferNum); // 通常2

    // 翻转相关辅助量
    TILING_DATA_FIELD_DEF(uint64_t, elems_per_batch); 
    TILING_DATA_FIELD_DEF(uint64_t, total_elements); 

END_TILING_DATA_DEF;

REGISTER_TILING_DATA_CLASS(FlipCustom, FlipCustomTilingData)
} // namespace optiling
#endif // FLIP_CUSTOM_TILING_H